#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=100005;
ll n,i,j,m,k,ansa=0,ansb=0,ans=0,num=0,l,vm,T,a[N],d[N],v[N],xa[N],px[N];
bool tap=0;
vector<ll> p;
struct xx
{
    ll l,r;
}q[N];
bool cmpa(xx aa,xx bb)
{
    return aa.l<bb.l||aa.l==bb.l&&aa.r<=bb.r;
}
int main()
{
    std::ios::sync_with_stdio(false);
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    cin>>T;
    while(T--)
    {
        ansa=0;ansb=0;num=0;ans=0;tap=0;
        cin>>n>>m>>l>>vm;
        for(i=1;i<=n;i++)
        {
            cin>>d[i]>>v[i]>>a[i];
            if(a[i]>0)
            {
                if(v[i]>vm)xa[i]=d[i];
                else
                {
                    xa[i]=(vm*vm-v[i]*v[i])/(2*a[i]);
                    //if(vm*vm-v[i]*v[i]!=2*a[i]*xa[i])xa[i]++;
                    xa[i]++;
                    xa[i]+=d[i];
                }
            }
            if(a[i]==0)
            {
                if(v[i]>vm)xa[i]=d[i];
                else xa[i]=l+1;
            }
            if(a[i]<0)
            {
                tap=1;
                if(v[i]<=vm)xa[i]=l+1;
                else
                {
                    xa[i]=(-v[i]*v[i]+vm*vm)/(2*a[i]);
                    if((-v[i]*v[i]+vm*vm)==2*a[i]*xa[i])xa[i]--;
                    xa[i]+=d[i];
                }
            }
        }
        for(i=1;i<=m;i++)
            cin>>px[i];
        sort(px+1,px+m+1);
        if(tap==0)
        {
            for(i=1;i<=n;i++)
            {
                if(px[m]>=xa[i])
                {
                    ansa++;
                }
            }
            cout<<ansa<<" "<<m-1<<endl;
            continue;
        }
        p.clear();
        for(i=1;i<=m;i++)p.push_back(px[i]);
        for(i=1;i<=n;i++)
        {
            //cout<<xa[i]<<endl;
            if(xa[i]>l)continue;
            if(a[i]>=0)
            {
                j=lower_bound(p.begin(),p.end(),xa[i])-p.begin();
                if(0<=j&&j<m)
                {
                    ansa++;
                    q[++num].l=j+1;q[num].r=m;
                }
            }
            else
            {
                k=lower_bound(p.begin(),p.end(),d[i])-p.begin();
                if(0<=k&&k<m)
                    if(p[k]<=xa[i])
                    {
                        ansa++;
                        j=upper_bound(p.begin(),p.end(),xa[i])-p.begin();
                        q[++num].l=k+1;q[num].r=j;
                    }
            }
            //cout<<i<<" "<<xa[i]<<" "<<j<<" "<<k<<" "<<p[k]<<" "<<ansa<<endl;
        }
        sort(q+1,q+num+1,cmpa);
         //for(i=1;i<=num;i++)cout<<q[i].l<<" "<<q[i].r<<endl;
        i=1;k=0;q[num+1].l=l+2;q[num+1].r=l+2;
        while(i<=num)
        {
            j=i;k=j+1;
            while(q[j].r>=q[k].l)k++;
            ans++;i=k;
        }
        cout<<ansa<<" "<<m-ans<<endl;
    }
    return 0;
}
/*
//f
*/
